package n17_两阶段终止模式_用volatile优化n2;

import lombok.extern.slf4j.Slf4j;

import static utils.Sleeper.sleep;

/**
 * 两阶段终止 设计模式
 */
@Slf4j(topic = "c.T7")
public class T1_interrupt_twoPhaseTermination {

    public static void main(String[] args) {

        log.debug("开始。。。");
        final TwoPhaseTermination tpt = new TwoPhaseTermination();
        // 1. 开始 监控线程
        tpt.start();

        // 2. 主线程 睡眠
        sleep(13);

        // 3. 终止 监控线程
        tpt.stop();


    }

}

@Slf4j(topic = "c.TwoPhaseTermination")
class TwoPhaseTermination{

    // 监控线程
    private Thread monitor;

    private volatile boolean stop = false; // 【虽然 不加volatile也能停止！是因为 debug和 sleep都会保证可见性！】

    // 启动 监控线程
    public void start(){
        monitor = new Thread(()->{
            while (true){
                final Thread current = Thread.currentThread();
                if(stop){
                    log.debug("线程被打断.... 料理后事......");
                    break;
                }

                try {
                    Thread.sleep(5000);    // 1. 这里被打断 interrupt=false
                    log.debug("执行监控记录。。。");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        });
        monitor.start();
    }


    // 停止 监控线程
    public void stop(){
        log.debug("修改 sotp=true");
        stop=true;
        monitor.interrupt(); // 不让 睡眠，让修改状态立即生效
    }



}
